<?php

declare(strict_types=1);

namespace App\Helpers;

use Riverside\Orm\Configuration;
use Riverside\Orm\Connection;
use UUID\UUID;

/**
 * Obtiene opciones y configuración de conexión de la base de datos.
 */
class Database
{
    private const CONFIG_FILENAME = 'database';

    private const ENVIRONMENT = 'default';

    private static Configuration $configuration;

    private static Connection $connection;

    /**
     * Establece las opciones de configuración de la base de datos.
     */
    private static function setConfiguration(array $options): void
    {
        $options = $options[self::ENVIRONMENT];

        self::$configuration = new Configuration(
            $options['username'],
            $options['password'],
            $options['database'],
            $options['host'],
            intval($options['port']),
            $options['driver'],
            $options['charset'],
            $options['collation']);
    }

    /**
     * Obtiene las opciones de configuración de la base de datos.
     */
    public static function getConfiguration(): Configuration
    {
        if (empty(self::$configuration)) {
            self::setConfiguration(Config::readFile(self::CONFIG_FILENAME));
        }

        return self::$configuration;
    }

    /**
     * Establece la configuración de conexión de la base de datos.
     */
    private static function setConnection(Configuration $configuration): void
    {
        self::$connection = new Connection($configuration);
    }

    /**
     * Obtiene la configuración de conexión de la base de datos.
     */
    public static function getConnection(): Connection
    {
        if (empty($connection)) {
            self::setConnection(self::getConfiguration());
        }

        return self::$connection;
    }

    /**
     * Genera un UUID aleatorio.
     */
    public static function generateUuid(): string
    {
        return UUID::uuid4();
    }
}
